/**
 * @file mpu6050.h
 * @author liufeng (liufeng@injoinic.com)
 * @brief mpu6050 driver
 * @version 0.1
 * @date 2024-11-13
 *
 * @copyright Copyright (c) 2024  injoinic
 *
 */

#ifndef __BSP_MPU6050_DRIVER_H__
#define __BSP_MPU6050_DRIVER_H__

#include "bsp_multibuffer.h"
#include "stdint.h"

// mpu6050 数据结构体
typedef struct
{
    int16_t accel_x_raw, accel_y_raw, accel_z_raw; // 加速度
    double ax, ay, az;

    int16_t gyro_x_raw, gyro_y_raw, gyro_z_raw; // 陀螺值
    double gx, gy, gz;

    float temperature; // 温度值
} mpu6050_data_typedef;

// mpu6050 driver结构体
typedef struct mpu6050_driver mpu6050_driver_typedef;
struct mpu6050_driver
{
    /* mcu相关外设初始化和逆初始化接口 */
    // TODO

    /* mpu6050接口 */
    uint8_t (*pf_init)(mpu6050_driver_typedef*);                   // 初始化
    uint8_t (*pf_deinit)(mpu6050_driver_typedef*);                 // 逆初始化

    void (*pf_sw_reset)(mpu6050_driver_typedef*);                  // 软件复位
    uint8_t (*pf_set_gyro_fsr)(mpu6050_driver_typedef*, uint8_t);  // 设置陀螺仪量程
    uint8_t (*pf_set_accel_fsr)(mpu6050_driver_typedef*, uint8_t); // 设置加速度量程
    uint8_t (*pf_set_lpf)(mpu6050_driver_typedef*, uint16_t); // 设置数字低通滤波器频率
    uint8_t (*pf_set_rate)(mpu6050_driver_typedef*, uint16_t); // 设置采样率

    uint8_t (*pf_get_temperature)(mpu6050_driver_typedef*);    // 获取温度值
    uint8_t (*pf_get_gyroscope)(mpu6050_driver_typedef*);      // 获取陀螺仪值
    uint8_t (*pf_get_accelerometer)(mpu6050_driver_typedef*);  // 获取加速度值
    uint8_t (*pf_get_all)(mpu6050_driver_typedef*);            // 获取所有参数

    /* 私有变量 */
    void* hi2c;                   // I2C句柄(hal库或类似hal库)
    void* task_handle;            // handler任务句柄
    void* unpack_queue;           // 用于发送缓冲区地址到解包任务
    void* semaphore_mutex_handle; // 互斥量句柄
    void (*pfdma_completed_callback)(mpu6050_driver_typedef*); // DMA传输完成回调函数
    void (*pfint_interrupt_callback)(mpu6050_driver_typedef*); // 外部中断回调函数

    /* 公共变量 */
    mpu6050_data_typedef data;
    DataBuffTypedef mpu6050_data_buff;
};

// 错误代码
typedef enum
{
    MPU6050_OK,      // 没有错误
    MPU6050_TIMEOUT, // IIC通讯超时
    MPU6050_EID      // ID错误
} mpu6050_status_type;

// mpu6050 driver构造函数
void mpu6050_construct(mpu6050_driver_typedef* mpu6050_instance, void* hi2c, void* task_handle);

#endif /* __BSP_MPU6050_DRIVER_H__ */
